home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / comm / net / amipop112.lha / AmiPOP112 / source / pop_main.c < prev    next >
C/C++ Source or Header  |  1994-09-22  |  8KB  |  462 lines

  1. /* AmiPOP By Scott Ellis */
  2.  
  3. #include "pop.h"
  4.  
  5. static const char VersionID[]="\0$VER:AmiPOP 1.12 "__AMIGADATE__;
  6.  
  7. /* Variables in pop.h */
  8.  
  9. char *pophost=NULL;
  10. char *username=NULL;
  11. char *password=NULL;
  12. char *passfake=NULL;
  13. char *maildir=NULL;
  14. char *cxname=NULL;
  15. char *cxdesc=NULL;
  16. char *hotkey=NULL;
  17. char *title=NULL;
  18. char *temp=NULL;
  19. char *buf=NULL;
  20. UBYTE *PubScreenName=NULL;
  21.  
  22. const char bum[]="Ok";
  23.  
  24. BOOL delmail=FALSE;
  25. BOOL checkper=FALSE;
  26. BOOL appfile=TRUE;
  27. BOOL winop=TRUE;
  28. BOOL notify=FALSE;
  29. BOOL immediate=FALSE;
  30. BOOL quiet=FALSE;
  31.  
  32. int timecheck=10;
  33. int port=110;
  34.  
  35. struct MsgPort *amipop_mp=NULL;
  36. struct MsgPort *timer_mp=NULL;
  37. struct timerequest *timerio=NULL;
  38. CxObj *broker=NULL;
  39. struct Library *TimerBase=NULL;
  40. struct IntuitionBase *IntuitionBase=NULL;
  41. struct Library *GadToolsBase=NULL;
  42.  
  43. struct NewBroker newbroker = {
  44.     NB_VERSION,   /* nb_Version - Version of the NewBroker structure */
  45.     "Not Active", /* nb_Name */
  46.     "Amiga POP © 1994 Scott Ellis",     /* nb_Title - Title of commodity that appears in CXExchange */
  47.     "Not Active", /* nb_Descr */
  48.     NBU_NOTIFY ,            /* nb_Unique - Tells CX not to launch another commodity with same name */
  49.     COF_SHOW_HIDE,            /* nb_Flags - Tells CX if this commodity has a window */
  50.     0,            /* nb_Pri - This commodity's priority */
  51.     0,            /* nb_Port - MsgPort CX talks to */
  52.     0             /* nb_ReservedChannel - reserved for later use */
  53. };
  54.  
  55. struct EasyStruct ereq =
  56.     {
  57.     sizeof(struct EasyStruct),
  58.     0,
  59.     "AmiPOP Notice",
  60.     "%s",
  61.     "%s",
  62.     };
  63.  
  64. UWORD __chip waitPointer[] =
  65.     {
  66.     0x0000, 0x0000,     /* reserved, must be NULL */
  67.  
  68.     0x0400, 0x07C0,
  69.     0x0000, 0x07C0,
  70.     0x0100, 0x0380,
  71.     0x0000, 0x07E0,
  72.     0x07C0, 0x1FF8,
  73.     0x1FF0, 0x3FEC,
  74.     0x3FF8, 0x7FDE,
  75.     0x3FF8, 0x7FBE,
  76.     0x7FFC, 0xFF7F,
  77.     0x7EFC, 0xFFFF,
  78.     0x7FFC, 0xFFFF,
  79.     0x3FF8, 0x7FFE,
  80.     0x3FF8, 0x7FFE,
  81.     0x1FF0, 0x3FFC,
  82.     0x07C0, 0x1FF8,
  83.     0x0000, 0x07E0,
  84.  
  85.     0x0000, 0x0000,     /* reserved, must be NULL */
  86.     };
  87.  
  88. enum args
  89.     {
  90.     USERNAME,
  91.     PASSWORD,
  92.     POPHOST,
  93.     MAILDIR,
  94.     CHECKPER,
  95.     TIME,
  96.     DELETE,
  97.     APPEND,
  98.     NOWINDOW,
  99.     PORT,
  100.     NOTIFY,
  101.     CX_POPKEY,
  102.     IMMEDIATE,
  103.     QUIET,
  104.     PUBSCREEN
  105.     };
  106.  
  107. /* Configure SAS Specific routines */
  108.  
  109. void __regargs __chkabort(void) {}
  110. /*int __oslibversion=37;*/
  111. long __stack = 20000;
  112.  
  113. /* End SAS */
  114.  
  115. ULONG            sigmask=NULL;
  116. ULONG            cxsigflag=NULL;
  117. ULONG            timesigflag=NULL;
  118.  
  119. struct Library *IconBase;
  120. struct RDArgs   *RDA;
  121.  
  122. int main(int argc, char **argv)
  123. {
  124.     int foo=0;
  125.     ULONG    mysig;
  126.  
  127.     IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37L);
  128.     GadToolsBase = OpenLibrary("gadtools.library",37L);
  129.  
  130.     if (GadToolsBase && IntuitionBase)
  131.     {
  132.         if (makevars())
  133.         {
  134.             freevars();
  135.             return(20);
  136.         }
  137.  
  138.         if ( parse(argc) )
  139.         {
  140.             if ( setuptime() )
  141.             {
  142.                 timesigflag = 1L << timer_mp->mp_SigBit;
  143.                 timereq();
  144.                 foo=1;
  145.  
  146.                 if ( setupcx() )
  147.                 {
  148.                     if (winop)
  149.                     {
  150.                         openup();
  151.                     }
  152.                 }
  153.                 else
  154.                 {
  155.                     foo=0;
  156.                 }
  157.             }
  158.         }
  159.         else
  160.         {
  161.             foo=0;
  162.         }
  163.  
  164.         if (immediate) MYGAD_BUTTONClicked(); /* Check mail immediately */
  165.  
  166.         while (foo)
  167.         {
  168.             if (winop)
  169.             {
  170.                 sigmask= 1 << Project0Wnd->UserPort->mp_SigBit ;
  171.             }
  172.             else
  173.             {
  174.                 sigmask= NULL;
  175.             }
  176.  
  177.             mysig=Wait ( sigmask | cxsigflag | timesigflag | SIGBREAKF_CTRL_C );
  178.  
  179.             if ( mysig & cxsigflag )
  180.             {
  181.                 foo=docx();
  182.             }
  183.                    if ( mysig & sigmask )
  184.             {
  185.                 foo=HandleProject0IDCMP();
  186.             }
  187.  
  188.             if ( mysig & timesigflag )
  189.             {
  190.                 if (checkper)
  191.                 {
  192.                     MYGAD_BUTTONClicked();
  193.                 }
  194.                 timereq();
  195.             }
  196.  
  197.             if (mysig & SIGBREAKF_CTRL_C )
  198.             {
  199.                 foo=0;
  200.             }
  201.         }
  202.  
  203.         closedown();
  204.  
  205.         closetime();
  206.  
  207.         closecx();
  208.  
  209.         freevars();
  210.  
  211.     }
  212.  
  213.     if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  214.     if (GadToolsBase) CloseLibrary(GadToolsBase);
  215.  
  216.     return(0);
  217. }
  218.  
  219. void openup(void)
  220. {
  221.     SetupScreen();
  222.     OpenProject0Window();
  223.  
  224.     winop=TRUE;
  225. }
  226.  
  227. void closedown(void)
  228. {
  229.     CloseProject0Window();
  230.     CloseDownScreen();
  231.  
  232.     winop=FALSE;
  233. }
  234.  
  235. BOOL parse( int argc )
  236. {
  237.     char    *OriginalTemplate =    "Username/K,Password/K,POPHost/K,MailDir/K,CheckPer/S,"
  238.                                 "Time/K/N,Delete/S,Append/S,NoWindow/S,Port/K/N,Notify/S,"
  239.                                 "Cx_Popkey/K,Immediate/S,Quiet/S,PubScreen/K";
  240.  
  241.     LONG    *ArgumentArray;        /* array for storing arguments retrieved by */
  242.  
  243.     char    **ToolArrayIndex,    /* workbench tooltypes array */
  244.             *ToolStringIndex,    /* index into string of concatenated workbench tooltypes */
  245.             *Template;            /* readargs template - varies slightly for WB or CLI */
  246.  
  247.     struct DiskObject    *DiskObject;    /* pointer to diskobject associated with program icon */
  248.     WORD    ArgCount = 1;        /* number of arguments in template */
  249.  
  250.     const char none[]="None Given";
  251.  
  252.     RDA = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
  253.     RDA->RDA_ExtHelp = NULL;
  254.  
  255.     Template = AllocVec(strlen(OriginalTemplate)+16,MEMF_CLEAR);
  256.  
  257.     for (    ToolStringIndex = OriginalTemplate;
  258.             ToolStringIndex = strchr(ToolStringIndex,',');
  259.             ToolStringIndex++, ArgCount++);
  260.  
  261.     ArgumentArray = AllocVec((ArgCount+1)*4,MEMF_CLEAR);
  262.  
  263.     if (argc==0)
  264.     {
  265.         if (IconBase = OpenLibrary("icon.library", 36L ) )
  266.         {
  267.  
  268.             CurrentDir(_WBenchMsg->sm_ArgList->wa_Lock);
  269.  
  270.             if (DiskObject = GetDiskObject(_WBenchMsg->sm_ArgList->wa_Name))
  271.             {
  272.                 for (    ToolArrayIndex = DiskObject->do_ToolTypes;
  273.                         *ToolArrayIndex;
  274.                         ToolArrayIndex++)
  275.                 {
  276.                     RDA->RDA_Source.CS_Length += (strlen(*ToolArrayIndex)+1);
  277.                 }
  278.  
  279.                 if (RDA->RDA_Source.CS_Length)
  280.                 {
  281.                     RDA->RDA_Source.CS_Buffer = AllocVec(RDA->RDA_Source.CS_Length+1,MEMF_CLEAR);
  282.                     ToolStringIndex = RDA->RDA_Source.CS_Buffer;
  283.  
  284.                     for (    ToolArrayIndex = DiskObject->do_ToolTypes;
  285.                             *ToolArrayIndex;
  286.                             ToolArrayIndex++)
  287.                     {
  288.                         ToolStringIndex = stpcpy(stpcpy(ToolStringIndex,*ToolArrayIndex)," ");
  289.                     }
  290.  
  291.                     *(ToolStringIndex-1) = '\n';
  292.                     FreeDiskObject(DiskObject);
  293.                 }
  294.             }
  295.  
  296.             stpcpy(stpcpy(Template,OriginalTemplate),",ThrowAway/M");
  297.  
  298.             CloseLibrary(IconBase);
  299.         }
  300.     }
  301.     else
  302.     {
  303.         strcpy(Template,OriginalTemplate);
  304.     }
  305.  
  306.     RDA = ReadArgs(Template,ArgumentArray,RDA);
  307.  
  308.     FreeVec(Template);
  309.  
  310.     if (RDA)
  311.     {
  312.         if (ArgumentArray[USERNAME])
  313.         {
  314.             strcpy(username,(char *)ArgumentArray[USERNAME]);
  315.         }
  316.         else
  317.         {
  318.             strcpy(username,none);
  319.         }
  320.  
  321.         if (ArgumentArray[PASSWORD])
  322.         {
  323.             strcpy(password,(char *)ArgumentArray[PASSWORD]);
  324.         }
  325.         else
  326.         {
  327.             strcpy(password,"");
  328.         }
  329.  
  330.         if (ArgumentArray[POPHOST])
  331.         {
  332.             strcpy(pophost,(char *)ArgumentArray[POPHOST]);
  333.         }
  334.         else
  335.         {
  336.             strcpy(pophost,none);
  337.         }
  338.  
  339.         if (ArgumentArray[MAILDIR])
  340.         {
  341.             strcpy(maildir,(char *)ArgumentArray[MAILDIR]);
  342.         }
  343.         else
  344.         {
  345.             strcpy(maildir,none);
  346.         }
  347.  
  348.         checkper=(BOOL)ArgumentArray[CHECKPER];
  349.  
  350.         if (ArgumentArray[TIME])
  351.         {
  352.             timecheck=*(int *)ArgumentArray[TIME];
  353.         }
  354.  
  355.         delmail=(BOOL)ArgumentArray[DELETE];
  356.         appfile=(BOOL)ArgumentArray[APPEND];
  357.         winop=!( (BOOL)ArgumentArray[NOWINDOW] );
  358.  
  359.         if (ArgumentArray[PORT])
  360.         {
  361.             port = *(int *)ArgumentArray[PORT];
  362.         }
  363.  
  364.         notify=(BOOL)ArgumentArray[NOTIFY];
  365.  
  366.         if (ArgumentArray[CX_POPKEY])
  367.         {
  368.             strcpy(hotkey,(char *)ArgumentArray[CX_POPKEY]);
  369.         }
  370.  
  371.         if (ArgumentArray[IMMEDIATE])
  372.         {
  373.             immediate=TRUE;
  374.         }
  375.  
  376.         if (ArgumentArray[QUIET])
  377.         {
  378.             quiet=TRUE;
  379.         }
  380.  
  381.         if (ArgumentArray[PUBSCREEN])
  382.         {
  383.             strcpy(PubScreenName,(UBYTE *)ArgumentArray[PUBSCREEN]);
  384.         }
  385.  
  386.         FreeParameters(ArgumentArray);
  387.  
  388.         return(TRUE);
  389.     }
  390.     else
  391.     {
  392.         FreeParameters(ArgumentArray);
  393.  
  394.         return(FALSE);
  395.     }
  396. }
  397.  
  398. void FreeParameters(LONG *ArgumentArray)
  399. {
  400.     if (RDA)
  401.     {
  402.         if ((RDA->RDA_Source.CS_Length) && (RDA->RDA_Source.CS_Buffer))
  403.         {
  404.             FreeVec(RDA->RDA_Source.CS_Buffer);
  405.         }
  406.  
  407.         FreeArgs(RDA);
  408.         FreeDosObject(DOS_RDARGS,RDA);
  409.     }
  410.     else
  411.     {
  412.         PrintFault(IoErr(), NULL);
  413.     }
  414.  
  415.     if (ArgumentArray)
  416.     {
  417.         FreeVec(ArgumentArray);
  418.     }
  419. }
  420.  
  421.  
  422. int doreq( const char *mes, const char *but)
  423. {
  424.     LONG answer;
  425.  
  426.     if ( !quiet )
  427.     {
  428.         answer= EasyRequest(NULL, &ereq, NULL, mes, but);
  429.  
  430.         if (Project0Wnd)
  431.         {
  432.             SetWindowTitles(Project0Wnd,Project0Wdt, (UBYTE *) ~0);
  433.         }
  434.  
  435.         return(answer);
  436.     }
  437. }
  438.  
  439. BOOL makevars(void)
  440. {
  441.     if ( pophost=AllocVec((7*BIGSTRING)+(4*SMALLSTRING)+(2*BUFSIZE)+(256),MEMF_CLEAR) )
  442.     {
  443.         username=pophost+BIGSTRING;
  444.         password=username+SMALLSTRING;
  445.         passfake=password+SMALLSTRING;
  446.         maildir=passfake+SMALLSTRING;
  447.         cxname=maildir+BIGSTRING;
  448.         cxdesc=cxname+BIGSTRING;
  449.         hotkey=cxdesc+(3*BIGSTRING);
  450.         title=hotkey+BIGSTRING;
  451.         temp=title+256;
  452.         buf=temp+BUFSIZE;
  453.         PubScreenName=buf+BUFSIZE;
  454.         return(FALSE);
  455.     }
  456.     return(TRUE);
  457. }
  458.  
  459. void freevars(void)
  460. {
  461.     if (pophost) FreeVec(pophost);
  462. }